草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 为什么有些 STL 算法提供额外的 '_if' 函数而不是重载?

这个问题在这里已经有了答案:Whydoesthestandardlibraryhavefindandfind_if?(4个答案)关闭7年前。为什么一些STL算法提供额外的'_if'函数而不是重载它?//example:find(beg,end,val);find_if(beg,end,pred);难道他们不能只重载这些算法而不是创建额外的_if函数吗?

c++ - 哪个 STL C++ 容器用于固定大小的列表?

我有一个消费应用程序,它需要在列表中存储最多100个对象以提供给回调进行处理,因为如果消费者没有catch,保留旧数据将是多余的。当新数据到达时,它可以简单地覆盖最旧的元素。我正在考虑使用循环缓冲区容器并猜测它会是deque,但发现它不使用循环列表,也没有设置固定最大大小的选项。dequeue中有一个max_size方法,但文档说“由于系统或库实现限制,这是容器可以达到的最大潜在大小。”我可以使用其他容器吗?PS:我正在使用VisualC++2010express 最佳答案 没有标准库容器可以直接执行您想要的操作。但是,您应该看看B

c++ - STL vector 是 realloc 的更好版本吗?

我认为,在C++中,处理重新分配的更好方法是使用STLvector,因为它保证了连续的存储位置。我有几个问题想了解其中的区别:有没有我需要更喜欢的场景realloc在vector上?还有什么(除了vector)等同于realloc吗?在C++中?谢谢, 最佳答案 只是vector,保证有连续的内存。不是其他人。realloc是一个C内存管理函数。在C++代码中不鼓励使用它。Stroustrup告诉您原因:Whydoesn'tC++haveanequivalenttorealloc()?However,realloc()isonlyg

c++ - STL 映射迭代器可以通过递增越界吗?

对于关联容器,++运算符能否将迭代器发送到集合末尾之后?例子:mapnew_map;new_map[0]=0;new_map[1]=1;mapnew_iter=new_map.begin();++new_iter;++new_iter;++new_iter;++new_iter;++new_iter;++new_iter;++new_iter;到此结束,是new_iter==new_map.end(),还是落入未知数?注意:我知道这是一团糟,而不是做事的方式。我正在处理一些WTF公司代码。 最佳答案 如果递增结束迭代器,结果是未定义

c++ - 对 C++ 堆分配器和 STL 进行碎片整理

我希望编写一个自碎片整理内存管理器,其中将一个简单的递增堆分配器与一个简单的压缩碎片整理程序结合使用。粗略的方案是从最低内存地址开始向上分配block,并保持簿记信息从最高内存地址开始向下工作。内存管理器会传回智能指针-boost的intrusive_ptr对簿记结构来说似乎是最明显的,然后它们本身会指向实际的内存块,从而提供一定程度的间接性,以便可以轻松地四处移动block。碎片整理程序将从“生成”书签开始压缩堆以加快进程,并且一次只对固定数量的内存进行碎片整理。指向block本身的原始指针在下一次碎片整理之前一直有效,因此可以自由传递,直到提高性能为止。这方面的具体应用是控制台游戏

c++ - 将 boost::geometry 多边形转换为 STL 对象

如何将boost::geometry多边形放入STL对象中?我确信这一定很简单,因为我无法在文档中的任何地方找到示例。然而,我花了大约4个完整的工作日来尝试做这件小事。我是C++的新手(长期的R程序员),但这些小的数据转换事情让我发疯。是的,有一个问题的标题很像我的:GettingthecoordinatesofpointsfromaBoostGeometrypolygon但是代码太复杂了(发帖者一直在修改它很多次),我无法理解它的正反面,我也无法想象其他C++新手能够做到。这是一个应该转换为其他一些boost::geometry数据类型的简单示例,因此希望任何人都能理解它。#incl

c++ - 为什么每个 STL 容器都有一个定义为成员函数的交换函数?

考虑queueSTL中的容器。据我了解swap()在中可用标题会工作得很好。我明白swap()只会复制queue表面上的实例,即只有front和rear指针将与size一起被复制,和其他数据成员。两个队列中的条目不会物理交换位置,但我不明白为什么在任何情况下都需要这样做,因为一旦交换指针和大小,两个队列就会有效地交换。 最佳答案 在C++11引入移动语义之前,std::swap的泛型实现别无选择,只能进行两次复制。从概念上讲,这:templatevoidswap(T&a,T&b){Tt(a);a=b;b=t;}请注意,这个泛型std

C++ STL 下一个排列与组合

我知道我可以在包含元素[1,2,3]的某个容器上使用std::next_permutation,这将生成此序列的6个排列。我想做的是给定一些集合[1,2,3,4,5,6]生成所有可能的大小为3的排列。所以对于这个例子,[4,3,2]将是由此标准产生的排列之一。我正在寻找一种STL方法来执行此操作(如果可能的话),而不是编写我自己的组合函数。我应该阅读任何特定的STL实现? 最佳答案 目前(截至2016年)没有单一的STD功能可以做到这一点。最接近的是来自http://www.open-std.org/jtc1/sc22/wg21/d

c++ - 公开自定义 STL 样式迭代的首选方法是什么?

(另见Isthereagoodwaynottohand-writealltwelverequiredContainerfunctionsforacustomtypeinC++?)对于一个类,例如namespaceJDanielSmith{classC{constsize_t_size;conststd::unique_ptr_data;public:C(size_tsize):_size(size),_data(newint[size]){}inlineconstint*get()constnoexcept{return_data.get();}inlineint*get()noexc

c++ - 检查 STL 中的空交集

如何检查两个std::set的空交集?我可以使用set_intersection,但这太慢了,我只需要bool答案。备注:std::set表示有序集合,它们属于同一类型等。 最佳答案 自己编码有什么问题吗?boolempty_intersection(constset&x,constset&y){set::const_iteratori=x.begin();set::const_iteratorj=y.begin();while(i!=x.end()&&j!=y.end()){if(*i==*j)returnfalse;elseif